fix: npm-resolution fixture self-conflicts on every Angular patch release - #1897
Merged
Conversation
…ease `angularAppWithPeers` inherited `@angular/core` and its siblings at `^20.3.0` from `ngNewApp()` but declared the two extra peers at this repository's exact pins. Every `@angular/animations` release peers on `@angular/core` exactly, so once Angular published 20.3.28 the inherited packages floated to it while `@angular/animations@20.3.27` held `@angular/core` back — and npm failed on a conflict no `@koobiq/*` package takes part in, which is the only thing this fixture exists to exercise. The fixture now declares both peers in the same range shape as the rest of it, the way `ngAddInstalls` and `documentedInstalls` already do. `check-npm-resolution` gates build.yml on every pull request and publish.yml on release, so this was failing every open pull request until the repository bumped its own Angular pin — and would break again on the next patch.
Contributor
There was a problem hiding this comment.
Pull request overview
Fixes the check-npm-resolution fixture apps so they don’t self-conflict on every upstream Angular patch release, ensuring the npm-resolution gate is stable for both PR validation and releases.
Changes:
- Updates the
angularAppWithPeers()fixture to use the same “ng new”-style range shapes (e.g.^x.y.0) for@angular/animationsand@angular/cdkinstead of pinning exact repo versions. - Expands the inline documentation to explain why mixing floated Angular ranges with exact pins causes immediate peer conflicts on Angular patch releases.
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
|
Visit the preview URL for this PR (updated for commit 30e209c): https://koobiq-next--prs-1897-hw6wq0q0.web.app (expires Sun, 16 Aug 2026 19:40:21 GMT) 🔥 via Firebase Hosting GitHub Action 🌎 Sign: c9e37e518febda70d0317d07e8ceb35ac43c534c |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
check-npm-resolutionis failing on every open pull request. It gatesbuild.yml(on every PR) andpublish.yml(on release), so releases are blocked too.The
angular-20-appandangular-20-app-ng-add-iconsfixtures contradict themselves.angularAppWithPeers()inherits@angular/coreand its siblings at^20.3.0fromngNewApp(), but declares the two extra peers at this repository's exact pins:Every
@angular/animationsrelease peers on@angular/coreexactly. So when Angular published 20.3.28 on 2026-08-13, the inherited packages floated to 20.3.28 while@angular/animations@20.3.27held@angular/coreat 20.3.27:No
@koobiq/*package takes part in that conflict — the fixture app fails to resolve before koobiq's peer ranges are ever evaluated, so the fixture currently exercises nothing. This recurs on every Angular patch release, until the repository bumps its own Angular pin.An earlier failure the same day had a second cause, now self-healed: Angular published 20.3.28 in a staggered sequence (
@angular/formsat 17:09:24 UTC,@angular/commononly at 17:33:14), so for ~24 minutes^20.3.0resolvedformsto 20.3.28 andcommonto 20.3.27, whichforms@20.3.28rejects. Nothing here can prevent a half-published upstream release; that window closed on its own.Fix
Declare both extra peers in the same range shape as the rest of the fixture — the way
ngAddInstalls(@angular/animations@${angularRange}) anddocumentedInstalls(ngNewRange(cdkVersion)) already do. That is also the shape a real consumer has: an app that ranng newand thenng addcarries^20.3.0, not the monorepo's pin.@angular/cdkis not part of today's conflict —cdk@20.2.14peers on the wide^20.0.0 || ^21.0.0— but pinning it exactly is the same latent trap, so it gets the same treatment.Deliberately not bumping the root Angular pin to 20.3.28: that goes green today and breaks again on 20.3.29, on every open PR. The file already argues against exactly this treadmill for
@koobiq/icons.Verification
Run locally against the live registry, with
dist/built:Before (this branch's parent) — reproduces CI exactly:
After:
Since
actions/checkoutbuilds the merge ref onpull_request, every open PR picks this up on a plain re-run of the failedbuildjob — no rebase needed.